#include "wx/wxprec.h"
#include "wx/xrc/xh_chckl.h"

IMPLEMENT_DYNAMIC_CLASS( wxCheckListBoxXmlHandler, wxXmlResourceHandler )

wxCheckListBoxXmlHandler::wxCheckListBoxXmlHandler()
  : wxXmlResourceHandler(), m_insideBox( false ) {
  // wxListBox styles:
  XRC_ADD_STYLE( wxLB_SINGLE );
  XRC_ADD_STYLE( wxLB_MULTIPLE );
  XRC_ADD_STYLE( wxLB_EXTENDED );
  XRC_ADD_STYLE( wxLB_HSCROLL );
  XRC_ADD_STYLE( wxLB_ALWAYS_SB );
  XRC_ADD_STYLE( wxLB_NEEDED_SB );
  XRC_ADD_STYLE( wxLB_SORT );
  AddWindowStyles();
}

wxObject *wxCheckListBoxXmlHandler::DoCreateResource() {
  if( m_class == wxT( "wxCheckListBox" ) ) {
    m_insideBox = true;
    CreateChildrenPrivately( NULL, GetParamNode( wxT( "content" ) ) );
    XRC_MAKE_INSTANCE( control, wxCheckListBox )
    control->Create( m_parentAsWindow,
                     GetID(),
                     GetPosition(), GetSize(),
                     strList,
                     GetStyle(),
                     wxDefaultValidator,
                     GetName() );
    wxXmlNode *n = GetParamNode( wxT( "content" ) );
    if( n ) {
      n = n->GetChildren();
    }
    int i = 0;
    while( n ) {
      if( n->GetType() != wxXML_ELEMENT_NODE ||
          n->GetName() != wxT( "item" ) ) {
        n = n->GetNext();
        continue;
      }
      wxString v = n->GetPropVal( wxT( "checked" ), wxEmptyString );
      v.MakeLower();
      if( v && v == wxT( "1" ) ) {
        control->Check( i, true );
      }
      i++;
      n = n->GetNext();
    }
    SetupWindow( control );
    strList.Clear();
    return control;
  } else {
    wxString str = GetNodeContent( m_node );
    if( m_resource->GetFlags() & wxXRC_USE_LOCALE ) {
      str = wxGetTranslation( str, m_resource->GetDomain() );
    }
    strList.Add( str );
    return NULL;
  }
}

bool wxCheckListBoxXmlHandler::CanHandle( wxXmlNode *node ) {
  return ( IsOfClass( node, wxT( "wxCheckListBox" ) ) ||
           ( m_insideBox && node->GetName() == wxT( "item" ) ) );
}
